﻿/**
 *		OssJson解析模块
 *@author		吴建凰
 *@date			2019年1月3日
 */
#ifndef OSS_JSON_H_
#define OSS_JSON_H_
#include <ossType.h>
#include <ossList.h>
#include <vector>

/**
 *		当前支持是数据类型
 */
typedef enum 
{
	JSON_NULL_VAL = 0,	///< 'null' value
	JSON_INT_VAL,		///< signed integer value
	JSON_LONG_VAL = JSON_INT_VAL,		///< signed long value
	JSON_DOUBLE_VAL,		///< double value,real value
    JSON_STRING_VAL,		///< string value
    JSON_BOOLEAN_VAL,	///< bool value
    JSON_ARRAY_VAL,		///< array value (ordered list)
	JSON_POINTER_VAL,		///< pointer value
    JSON_OBJ_VAL,		///< object value (collection of name/value pairs). 
	JSON_VECTOR_BYTE,		///std::vector<BYTE>
}JsonValueType;

/**
 *		json解析类
 */
class OssJson
{
public:
	OssJson();
	OssJson(const OssJson& obj);
	OssJson(const char* jsonStr);
	virtual ~OssJson();

	/**
	 *		解析Json字符串
	 *@pcJson		Json入参
	 *@return		成功返回0
	 *				失败返回错误位置
	 */
	int ParseJson(const char* pcJson);

	

	/** 
	 *		转换为double
	 */
	double asDouble() const;

	/**
	 *		转换为int
	 */
	int asInt() const;
	long asLong() const;

	/**
	 *		转换为char*
	 */
	const char* asCString() const;

	/**
	 *		转换为bool
	 */
	bool asBool() const;

	/**
	 *		转换为Json对象
	 */
	OssJson& asObj();

	/**
	 *		转换为指针类型
	 */
	void* asPointer() const ;

	/**
	 *		转换为std::vector<BYTE>
	 */
	std::vector<Byte>	asVectorByte() const;
	
	/**
	 *		转换为BYTE*
	 */
	Byte* asBytes() const;


	/**
	 *		获取当前Json的数据类型
	 */
	JsonValueType ValueType() const;

	/**
	 *		获取数组长度
	 */
	int Size() const;

	/**
	 *		获取第i个原始
	 */
	OssJson& operator[](int i);
	const OssJson& operator[](int i) const ;


	/**
	 *		根据key获取到对应的值
	 */
	OssJson& operator[](const char* pcKey);
	const OssJson& operator[](const char* pcKey) const;

	/**
	 *		比较字符串
	 */
	bool operator !=(const char* pcVal) const;

	/**
	 *		比较字符串
	 */
	bool operator ==(const char* pcVal) const;

	/**
	 *		比较字符串
	 */
	bool operator ==(const OssJson& json) const;
	bool operator !=(const OssJson& json) const;

	/**
	 *		赋值
	 */
	OssJson& operator =(const OssJson& obj);
	OssJson& operator =(int iVal);
	OssJson& operator =(long iVal);
	OssJson& operator =(const char* strVal);
	OssJson& operator =(double dVal);
	OssJson& operator =(void* pPoint);
	OssJson& operator =(std::vector<Byte>& datas);
	OssJson& operator =(bool isTrue);
	OssJson& operator +=(long iVal);
	OssJson& operator +=(double dVal);
	OssJson& operator +=(const char* strVal);

	OssJson& setValue(const OssJson& obj);
	OssJson& setValue(int iVal);
	OssJson& setValue(long iVal);
	OssJson& setValue(const char* strVal);
	OssJson& setValue(double dVal);
	OssJson& setValue(void* pPoint);
	OssJson& setValue(const std::vector<Byte>& datas);
	OssJson& setValue(const Byte* datas, int iLens);
	OssJson& setValue(bool isTrue);

	OssJson& Format(const char* lpszFormat, ...);

	/**
	 *		判断当前是否为空值
	 */
	bool IsNull() const;

	/**
	 *		转换为Json字符串
	 *@pcJsonBuff		存放Json字符串的内存
	 *@iBufMax			pcJsonBuff可存放的最大容量
	 *@return			成功返回使用的字节个数
	 *					失败反馈0
	 */
	int ToJsonString(char* pcJsonBuff,int iBufMax) const;

	/**
	 *		放入一个元素，针对数组类型的操作
	 * *@return		返回当前插入的元素
	 */
	OssJson& Push(long lVal);
	OssJson& Push(double dVal);
	OssJson& Push(const char* strVal);
	OssJson& Push(const OssJson& obj);
	OssJson& Push(std::vector<Byte> datas);
	OssJson& Push(bool isTrue);
	OssJson& Push(Byte* datas, int dataLen);

	/**
	 *		移除指定的元素,针对数组
	 */
	OssJson& Remove(int index);
	//针对Obj对象
	OssJson& Remove(const char* pcKey);

	/**
	 *		清空所有变量
	 */
	void Clear();

	/**
	 *		通过指定的字段排序
	 *@notes		排序只针对数组和对象有效,如果其子对象不是OBJ类型，则pcKey无效，按子对象的具体值对比
	 */
	bool SortByKey(const char* pcKey);

	/**
	 *		获取所有的KEY
	 * @return		返回json为["key1","key2",...]
	 */
	OssJson GetKeys();

	/**
	 *		获取自己的KEY
	 */
	const char* GetKey() const;
	
	/**
	 *		追加Json
	 * *@appendJson		将appendJson追加到当前的json对象中
	 * *@bReplace		出现重复的key是否替换的标志，true则替换，false则保留原来的
	 * *@return			
	 */
	bool appendJson(const OssJson& appendJson,bool bReplace=true);

	/**
	 *		将GBK编码的字符串切换到utf8编码方式
	 */
	bool GbkToUtf8Encoding();

	/**
	 *		将utf8编码的字符串切换到GBK编码方式
	 */
	bool Utf8ToGbkEncoding();

	/**
	 *		保存到文件
	 */
	int SaveToFile(const char* filePath);

	/**
	 *		读取文件内容解析
	 */
	int ParseFormFile(const char* filePath);
private:
	/**
	 *		解析当前key-value
	 */
	char* ParseKeyVale(char* pcKeyValue);

	/**
	 *		拾取Key
	 */
	char* PickKey(const char* pcKeyStart,const char* pcKeyEnd,char bT);

	/**
	 *		拾取Val
	 */
	char* PickStringVal(char* pcValStart,char* pcValEnd,char bT);

	/**
	 *		拾取int值
	 */
	long PickLongVal(char* pcValStart,char* pcValEnd);

	/**
	 *		拾取指针值
	 */
	void* PickPointerVal(char* pcValStart, char* pcValEnd);

	/**
	 *		拾取double值
	 */
	double PickDoubleVal(char* pcValStart,char* pcValEnd);

	/**
	 *		拾取Boolean值
	 */
	bool PickBooleanVal(char* pcValStart,char* pcValEnd);

	/**
	 *		拾取数组
	 */
	char* PickArrayVal(char* pcKeyValue);

	/**
	 *		拾取对象
	 */
	char* PickObjectVal(char* pcKeyValue);

	/**
	 *		拾取vector<byte>
	 */
	Byte* PickVectorByte(char* pcKeyValue, char* pcValEnd);

	/**
	 *		str Value转换为json字符串
	 *@pcJsonBuff		存放Json字符串的内存
	 *@iBufMax			pcJsonBuff可存放的最大容量
	 *@return			成功返回使用的字节个数
	 *					失败反馈0
	 */
	int StrToJsonString(char* pcJsonBuff,int iBufMax)  const;

	/**
	 *		str Value转换为json字符串
	 *@pcJsonBuff		存放Json字符串的内存
	 *@iBufMax			pcJsonBuff可存放的最大容量
	 *@return			成功返回使用的字节个数
	 *					失败反馈0
	 */
	int LongToJsonString(char* pcJsonBuff,int iBufMax)  const;

	/**
	 *		str Value转换为json字符串
	 *@pcJsonBuff		存放Json字符串的内存
	 *@iBufMax			pcJsonBuff可存放的最大容量
	 *@return			成功返回使用的字节个数
	 *					失败反馈0
	 */
	int DoubleToJsonString(char* pcJsonBuff,int iBufMax)  const;

	/**
	 *		str Value转换为json字符串
	 *@pcJsonBuff		存放Json字符串的内存
	 *@iBufMax			pcJsonBuff可存放的最大容量
	 *@return			成功返回使用的字节个数
	 *					失败反馈0
	 */
	int BooleanToJsonString(char* pcJsonBuff,int iBufMax)  const;

	/**
	 *		str Value转换为json字符串
	 *@pcJsonBuff		存放Json字符串的内存
	 *@iBufMax			pcJsonBuff可存放的最大容量
	 *@return			成功返回使用的字节个数
	 *					失败反馈0
	 */
	int ObjectToJsonString(char* pcJsonBuff,int iBufMax)  const;

	/**
	 *		str Value转换为json字符串
	 *@pcJsonBuff		存放Json字符串的内存
	 *@iBufMax			pcJsonBuff可存放的最大容量
	 *@return			成功返回使用的字节个数
	 *					失败反馈0
	 */
	int ArrayToJsonString(char* pcJsonBuff,int iBufMax)  const;

	/**
	 *		point Value转换为json字符串
	 *@pcJsonBuff		存放Json字符串的内存
	 *@iBufMax			pcJsonBuff可存放的最大容量
	 *@return			成功返回使用的字节个数
	 *					失败反馈0
	 */
	int PointerToJsonString(char* pcJsonBuff, int iBufMax)  const;

	/**
	 *		vector<byte>转换为json字符串
	 *@pcJsonBuff		存放Json字符串的内存
	 *@iBufMax			pcJsonBuff可存放的最大容量
	 *@return			成功返回使用的字节个数
	 *					失败反馈0
	 */
	int VectorBytesToJsonString(char* pcJsonBuff, int iBufMax)  const;

	/**
	 *		释放原来的Val
	 */
	bool FreeVal();

	//
private:
	//key
	char*			m_pcKey;
	union
	{
		double		m_dVal;
		long		m_lVal;
		char*		m_strVal;
		bool		m_bVal;
		void*		m_pPoint;
		Byte*		m_datas;
	};
	JsonValueType		m_wValType;
	int					m_iValLen;
	OssListNode			m_objList;
	OssListNode			m_node;

	friend int GetOssJsonDigitalEx(OssListNode* node,int num,void* pUserData);
};

int OssGetProfileByJson(const OssJson& jsonData, const char* key, const char* pcDefault
	, OUT char* pcBuf, int iMax);

int OssGetProfileByJson(const OssJson& jsonData, const char* key, int iDefault);
#endif